home *** CD-ROM | disk | FTP | other *** search
- Path: uunet!rs
- From: rs@uunet.UU.NET (Rich Salz)
- Newsgroups: comp.sources.unix
- Subject: v10i030: Find and remove stale files from a disk.
- Message-ID: <522@uunet.UU.NET>
- Date: 2 Jul 87 03:04:49 GMT
- Organization: UUNET Communications Services, Arlington, VA
- Lines: 419
- Approved: rs@uunet.uu.net
-
- Submitted by: maddog!root
- Mod.Sources: Volume 10, Number 30
- Archive-Name: derez
-
- Derez, a program to find and enmourge stale files on a disk.
-
- [ This is great -- my first "anonymous" contribution. I couldn't find
- "enmourge" in my Webster's Universal; it apparently means remove.
- -- r$ ]
-
- #! /bin/sh
- # This is a shell archive. Remove anything before this line, then unpack
- # it by saving it into a file and typing "sh file". To overwrite existing
- # files, type "sh file -c". You can also feed this as standard input via
- # unshar, or by typing "sh <file", e.g.. If this archive is complete, you
- # will see the following message at the end:
- # "End of shell archive."
- # Contents: README makefile derez.1 readbyte.1 derez.c readbyte.c
- # Wrapped by rs@uunet on Wed Jul 1 22:52:21 1987
- PATH=/bin:/usr/bin:/usr/ucb ; export PATH
- if test -f README -a "${1}" != "-c" ; then
- echo shar: Will not over-write existing file \"README\"
- else
- echo shar: Extracting \"README\" \(1140 characters\)
- sed "s/^X//" >README <<'END_OF_README'
- XDerez, a program to find and enmourge stale files on a disk.
- X
- XThis code is explicitly placed in the public domain by the author
- Xand may be used for fun or profit. It is explicitly not copyrighted
- Xand contains no references to the author's true name. This is by
- Xdesign as the author does not what to become "known" as the author of
- XDerez.
- X
- XAnyone having problems with derez should send a mail request to maddog!root
- Xfor possible help or suggestions. Anyone who fixes some of derez's bugs or
- Xinadequacies is invited to send maddog!root a copy of the patches. We can
- Xalways use a better, but not necessarily less Draconian, derez on our system.
- X
- XDerez does not contain a mechanism to warn users about the impending
- Xremoval of stale files. We have found that doing this only invites the
- Xusers to go and defeat the effects of derez totally without archiving
- Xtheir stale files to tape and removing them from disk. On systems with
- Xcooperative users, perhaps a separate program that sends users mail about
- Xtheir stale files, listing their path names might be helpful.
- X
- XXXXXXXXXXXXXXXXXXXXX Cut here and feed it to /bin/sh XXXXXXXXXXXXXXXXXXX
- END_OF_README
- if test 1140 -ne `wc -c <README`; then
- echo shar: \"README\" unpacked with wrong size!
- fi
- # end of overwriting check
- fi
- if test -f makefile -a "${1}" != "-c" ; then
- echo shar: Will not over-write existing file \"makefile\"
- else
- echo shar: Extracting \"makefile\" \(414 characters\)
- sed "s/^X//" >makefile <<'END_OF_makefile'
- XCFLAGS = -O
- XPROGS = derez readbyte
- XMANS = derez.1 readbyte.1
- X
- Xall : $(PROGS)
- X
- Xinstall : all $(MANS)
- X install -c derez /usr/local/bin
- X install -c -m 644 derez.1 /usr/man/manl/derez.l
- X install -c readbyte /usr/local/bin
- X install -c -m 644 readbyte.1 /usr/man/manl/readbyte.l
- X
- Xclean :
- X rm -f *.o
- X
- Xclobber : clean
- X rm -f $(PROGS)
- X
- Xderez : derez.c
- X cc -o derez derez.c
- X
- Xreadbyte : readbyte.c
- X cc -o readbyte readbyte.c
- END_OF_makefile
- if test 414 -ne `wc -c <makefile`; then
- echo shar: \"makefile\" unpacked with wrong size!
- fi
- # end of overwriting check
- fi
- if test -f derez.1 -a "${1}" != "-c" ; then
- echo shar: Will not over-write existing file \"derez.1\"
- else
- echo shar: Extracting \"derez.1\" \(3578 characters\)
- sed "s/^X//" >derez.1 <<'END_OF_derez.1'
- X.TH DEREZ LOCAL "2 February 1987"
- X.UC 4
- X.SH NAME
- Xderez \- find stale files, and move them into a MORGUE directory
- X.SH SYNOPSIS
- X.br
- X\fBderez [-t days] [dir1 dir2 dir3 ...]\fP
- X.SH DESCRIPTION
- X.I Derez
- Xis a program which is used to archive stale files.
- XMost if not \fIall\fP UNIX systems suffer from the finite disk size problem.
- XIf this problem is aggravated by users which have stale files that have not
- Xbeen read for some time,
- Xderez offers a solution.
- XIt moves the stale files to a \fIMORGUE\fP directory so that they can
- Xlater be archived using \fItar\fP.
- X.sp
- X\fIDerez\fP uses the access times,
- Xtime last \fIread\fP not time last \fBwritten\fP,
- Xof the files to determine their staleness.
- XThe default number of days since last access is 180 days,
- Xbut this can be changed using the \fB-t\fP option.
- XIf no directory list is given to derez it searches current directory,
- Xexcept the subdirectory \fIMORGUE\fP.
- XThe \fB-t\fP option and a directory list can be used to give special handling to
- Xantisocial users.
- X.sp
- XDerez can be defeated by using \fIfind\fP and \fIreadbyte\fP to find and read all
- Xof the files in a directory tree.
- XAlthough doing this might be reasonable for some directory that you haven't
- Xlooked at in some time, but will be using in a few days,
- Xdoing this to \fBall\fP of your files to defeat derez is considered antisocial
- Xand is dealt with using back up options.
- XThese options include:
- Xchanging derez's definition of staleness from several months to one day or less for the
- Xantisocial user,
- Xarchiving directories of the antisocial user by hand and
- Xremoval of the antisocial user's account from the machine.
- XIf you are going to use \fIreadbyte\fP to save some files from derez,
- Xyou should check with \fBroot\fP first to make sure that the action won't be
- Xinterpreted as antisocial.
- X.sp
- XThe best way to avoid getting derez'ed is to actively archive your stale files
- Xonto tape using tar and keep them off line.
- XIf a user actively archives his stale files onto tape,
- Xa rather large disk usage for truly active files will be tolerated.
- X.sp
- XAlthough derez was written for \fBroot's\fP use,
- Xan individual user can use it to find and archive his stale files.
- XThis is done by making a subdirectory with the name \fIMORGUE\fP in any directory
- Xyou would like to archive the descendant stale files.
- XYou then run \fIderez\fP.
- XDerez will create a list of stale files,
- Xwith the name \fIMORGUE/DEREZ\fP and then move the stale files into the directory
- XMORGUE.
- XIf a file that is removed is the last file in it's parent directory,
- Xthe parent directory is removed.
- XThe contents of the morgue directory can be archived using tar and then removed from the disk.
- XThe use of \fIderez\fP for stale file control is highly recommended.
- XScratch tapes can be found next to the system console.
- X.sp
- XFiles that have been derez'ed by root can be recovered from the archive tape using
- X\fItar\fP.
- XTo recover all one's stale files without moving some or all off line
- Xwith personal archive tapes is considered antisocial.
- X.SH SEE ALSO
- Xfind, readbyte
- X.ta 3.0i
- X.SH FILES
- X/usr/local/morgue/derez.mm.dd.yy Lists of files derez'ed by root.
- X.br
- XMORGUE/DEREZ The files derez will enmorgue.
- X.br
- XMORGUE/* The enmorgued files.
- X.SH "BUGS(Not to be taken advantage of)"
- XDEREZ shares tar's limits on path name lengths.
- X.br
- XDerez does not archive files with more than one hard link as they
- Xwould get seperated into several copies of the files in the current
- Ximplementation.
- X.br
- XMORGUE and DEREZ are reserved names.
- X.br
- XDerez will not move files with path names of the form MORGUE/* or DEREZ
- Xfor obvious reasons.
- END_OF_derez.1
- if test 3578 -ne `wc -c <derez.1`; then
- echo shar: \"derez.1\" unpacked with wrong size!
- fi
- # end of overwriting check
- fi
- if test -f readbyte.1 -a "${1}" != "-c" ; then
- echo shar: Will not over-write existing file \"readbyte.1\"
- else
- echo shar: Extracting \"readbyte.1\" \(631 characters\)
- sed "s/^X//" >readbyte.1 <<'END_OF_readbyte.1'
- X.TH READBYTE LOCAL "2 February 1987"
- X.UC 4
- X.SH NAME
- Xreadbyte \- Read the first byte of a file, removing its staleness
- X.SH SYNOPSIS
- X.br
- X\fBreadbyte filename\fP
- X.SH DESCRIPTION
- X.I Readbyte
- Xreads the first byte of the specified file,
- Xchanging its access date.
- XIt is used to remove staleness of a file to prevent derez from
- Xputting the file in the morgue for archival onto tape.
- XExcessive use of \fIreadbyte\fP, or any other means of updating
- Xthe access date of a file to defeat \fIderez\fP,
- Xis interpreted as antisocial by root.
- XAntisocial behavior is dealt with as described in the man page for \fIderez\fP.
- X.SH SEE ALSO
- Xfind, derez
- END_OF_readbyte.1
- if test 631 -ne `wc -c <readbyte.1`; then
- echo shar: \"readbyte.1\" unpacked with wrong size!
- fi
- # end of overwriting check
- fi
- if test -f derez.c -a "${1}" != "-c" ; then
- echo shar: Will not over-write existing file \"derez.c\"
- else
- echo shar: Extracting \"derez.c\" \(4388 characters\)
- sed "s/^X//" >derez.c <<'END_OF_derez.c'
- X/* This program archives and removes all files on /u0
- Xthat have not been accessed in 180 days.
- X */
- X
- X#include <sys/types.h>
- X#include <sys/stat.h>
- X#include <sys/file.h>
- X#include <strings.h>
- X
- X#define MAXLEN 10240
- X#define USAGE "derez [-t days] [dir1 dir2 dir3 ...]\n"
- X
- X#include <stdio.h>
- X
- Xmain(argc, argv)
- Xint argc;
- Xchar **argv;
- X{
- X FILE *fptr;
- X struct stat statbuf;
- X char filename[MAXLEN];
- X char cmd[MAXLEN];
- X char dirlist[MAXLEN];
- X int since;
- X
- X dirlist[0] = NULL;
- X since = 180;
- X
- X
- X /* Check for the existence and access permissions on the MORGUE.
- X */
- X if(stat("MORGUE", &statbuf)) {
- X perror("derez: MORGUE");
- X exit(1);
- X }
- X if(!(statbuf.st_mode & S_IFDIR)) {
- X fprintf(stderr, "derez: MORGUE is not a directory\n");
- X exit(1);
- X }
- X if(access("MORGUE", R_OK | W_OK | X_OK)) {
- X fprintf(stderr, "derez: The MORGUE must have read, write and execute perms\n");
- X exit(1);
- X }
- X
- X if(argc > 1) {
- X if(strcmp(argv[1], "-t") == 0) {
- X if(argc < 3) {
- X fprintf(stderr, USAGE);
- X exit(1);
- X }
- X if(sscanf(argv[2], "%d", &since) != 1) {
- X fprintf(stderr, "derez: bad arg for -t option %s\n", argv[2]);
- X exit(1);
- X }
- X if(since < 1 || since > 1000) {
- X fprintf(stderr, "derez: bad value for -t argument\n");
- X exit(1);
- X }
- X argv += 2;
- X argc -= 2;
- X }
- X while(argc > 1) {
- X if((strncmp(argv[1], "/", strlen("/")) == 0) || (strncmp(argv[1], "../", strlen("../")) == 0)) {
- X fprintf(stderr, "derez: Directories must be relative to .\n");
- X exit(1);
- X }
- X if(lstat(argv[1], &statbuf)) {
- X fprintf(stderr, "The directory %s must exist\n", argv[1]);
- X exit(1);
- X }
- X if(statbuf.st_mode & S_IFDIR) {
- X if(dirlist[0] != NULL)
- X strcat(dirlist, " ");
- X strcat(dirlist, argv[1]);
- X argv += 1;
- X argc -= 1;
- X }
- X else {
- X fprintf(stderr, "derez: %s is not a directory\n", argv[1]);
- X exit(1);
- X }
- X }
- X }
- X /* We currently only derez files with 1 link as derez would
- X break up two links to the same file into seperate files.
- X We will have to steal code from tar to do an internal link table
- X and drop the use of tar completely.
- X */
- X sprintf(cmd, "find %s -type f -links 1 -atime +%d -print > MORGUE/DEREZ",
- X (dirlist[0] == NULL ? "." : dirlist), since);
- X
- X printf("%s\n", cmd);
- X if(system(cmd) != 0) {
- X fprintf(stderr, "derez: The attempt to create MORGUE/DEREZ failed\n");
- X exit(1);
- X }
- X if((fptr = fopen("MORGUE/DEREZ", "r")) == NULL) {
- X fprintf(stderr, "Open of MORGUE/DEREZ for reading failed\n");
- X exit(1);
- X }
- X while(fgets(filename, MAXLEN, fptr) != NULL) {
- X char *rightslash;
- X /* Kill off the newline. */
- X if(filename[strlen(filename) - 1] != '\n') {
- X fprintf(stderr, "missing \\n on %s\n", filename);
- X continue;
- X }
- X filename[strlen(filename) - 1] = NULL;
- X
- X /* If the file path name is too long we don't want
- X to see the error message from tar.
- X */
- X if(strlen(filename) > 99)
- X continue;
- X
- X /* If the file basename is of the form .* we want to
- X leave it alone to prevent removal of someones login
- X directory or setup files. Of course if you take this
- X code out you get automatic removal of directories
- X associated with inactive accounts.
- X */
- X if((rightslash = rindex(filename, '/')) != NULL) {
- X if(rightslash[1] == '.')
- X continue;
- X }
- X
- X if(
- X /* We don't want to mess with files already in the MORGUE.
- X */
- X (strncmp(filename, "./MORGUE/", strlen("./MORGUE/")) != 0)
- X && (strncmp(filename, "MORGUE/", strlen("MORGUE/")) != 0)
- X /* The lost+found directory is a sacred system item.
- X */
- X && (strncmp(filename, "./lost+found/", strlen("./lost+found/")) != 0)
- X && (strncmp(filename, "lost+found/", strlen("lost+found/")) != 0)
- X /* If we were to enmorgue a file named DEREZ, we
- X would overwrite the list of files to move.
- X */
- X && (strncmp(filename, "./DEREZ") != 0)
- X && (strcmp(filename, "DEREZ") != 0)
- X ){
- X sprintf(cmd, "tar cf - %s | (cd MORGUE; tar xpf -)", filename);
- X if(system(cmd) == 0) {
- X fprintf(stderr, "enmorgue of %s succeeded\n", filename);
- X unlink(filename);
- X /* If it was the last file in the directory
- X we also want to remove the directory.
- X */
- X while(strlen(filename) > 0 && filename[strlen(filename) - 1] != '/') {
- X filename[strlen(filename) - 1] = NULL;
- X }
- X filename[strlen(filename) - 1] = NULL;
- X rmdir(filename);
- X }
- X else {
- X fprintf(stderr, "enmorgue of %s FAILED, file removal was inhibited\n", filename);
- X }
- X }
- X }
- X fclose(fptr);
- X}
- END_OF_derez.c
- if test 4388 -ne `wc -c <derez.c`; then
- echo shar: \"derez.c\" unpacked with wrong size!
- fi
- # end of overwriting check
- fi
- if test -f readbyte.c -a "${1}" != "-c" ; then
- echo shar: Will not over-write existing file \"readbyte.c\"
- else
- echo shar: Extracting \"readbyte.c\" \(363 characters\)
- sed "s/^X//" >readbyte.c <<'END_OF_readbyte.c'
- X#include <stdio.h>
- X
- Xmain(argc,argv)
- Xint argc;
- Xchar *argv[];
- X{
- X int fd;
- X char cbuffer[512];
- X
- X if(argc != 2) {
- X fprintf(stderr,"usage: readbyte file\n");
- X exit(1);
- X }
- X if((fd=open(argv[1],0)) < 0) {
- X fprintf(stderr,"cant open %s\n",argv[1]);
- X exit(1);
- X }
- X if(read(fd,cbuffer,1) != 1) {
- X fprintf(stderr,"cant read byte from file %s\n",argv[1]);
- X exit(1);
- X }
- X}
- END_OF_readbyte.c
- if test 363 -ne `wc -c <readbyte.c`; then
- echo shar: \"readbyte.c\" unpacked with wrong size!
- fi
- # end of overwriting check
- fi
- echo shar: End of shell archive.
- exit 0
-